﻿
CREATE PROCEDURE [dbo].[LedgerAccountsDelete]
(--удаление счета вместе с дочерними субсчетами
	@Original_Id int,
	@Original_MD datetime,
	@MW varchar(50) -- если = PhysicallyDelete то запись удаляется физически. В противном случае поле ToDelete устанавливается в 1
)
AS
DECLARE @tblAccTree TABLE (
Id int NOT NULL, 
AccLevel int NOT NULL
)
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int
DECLARE @intLineId int, @datLineMD datetime
DECLARE @datMD datetime, @intDepartmentId int, @bitPhysicallyDelete bit

	SET NOCOUNT ON;

IF (@Original_Id Is Null) OR (@Original_MD Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF (@Original_Id = 1)
BEGIN
	SELECT @intErrCode = 2, 
	@strMsg = 'Нельзя удалять счет с идентификатором равным 1!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @intRet = Id
FROM CO.LedgerAccounts WHERE Id = @Original_Id AND MD = @Original_MD
IF (@@rowcount <> 1)
BEGIN
	SELECT @intErrCode = 3, 
	@strMsg = 'Данные изменены после последнего запроса!'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

SET @intRet = 0;

--определние удаляемых счетов
	WITH ThisAccounts(Id, ParentID, AccLevel) AS 
	(
		SELECT Id, ParentID, 0 AS AccLevel
		FROM CO.LedgerAccounts
		WHERE Id = @Original_Id
		UNION ALL
		SELECT C.Id, C.ParentID, AccLevel + 1
		FROM CO.LedgerAccounts C INNER JOIN ThisAccounts P ON C.ParentID = P.Id 
	)

	INSERT INTO @tblAccTree (Id, AccLevel)
	SELECT Id, AccLevel FROM ThisAccounts

--проверка типов проводок
IF EXISTS (
SELECT T.Id FROM CO.LedgerTransTypes T INNER JOIN @tblAccTree S 
ON (T.DebitLedgerAccountId = S.Id OR T.CreditLedgerAccountId = S.Id) )
BEGIN
	SELECT @intErrCode = 4, 
	@strMsg = 'Существуют типы проводок для удаляемого счета/субсчета с идентификатором ' + cast(@Original_Id as varchar(20)) + ' !'
	RAISERROR (@strMsg, 11, 1)
	RETURN @intErrCode
END

--Проверка возможности физического удаления записи из таблиц справочников
EXEC @intRet = dbo.CheckDictionaryDelete @bitPhysicallyDelete OUTPUT, @intDepartmentId OUTPUT, @MW OUTPUT
IF @intRet <> 0 RETURN @intRet

EXEC [dbo].[ProcessStatistic] Null, @datMD OUTPUT, @MW OUTPUT

	SET NOCOUNT OFF;

IF @intDepartmentId <> 0 --в поздразделениях запись всегда физически удаляется
	DELETE D FROM CO.LedgerAccounts D INNER JOIN @tblAccTree S ON S.Id = D.Id
ELSE
BEGIN
	IF @bitPhysicallyDelete = 1
		DELETE D FROM CO.LedgerAccounts D INNER JOIN @tblAccTree S ON S.Id = D.Id
	ELSE --Обычные пользователи только помечают запись для удаления
		UPDATE D SET 
		D.ToDelete = 1,
		D.[MD] = @datMD, D.[MW] = @MW
		FROM CO.LedgerAccounts D INNER JOIN @tblAccTree S ON S.Id = D.Id
END

SET @intErrCode = @@error
IF @intErrCode <> 0
BEGIN 
	IF @@trancount > 0 ROLLBACK TRANSACTION
	RETURN @intErrCode
END

RETURN 0